//mutations: 更改state的方法
import { IState, ITodo, TODO_STATUS } from '@/typings';
import {
  SET_TODO,
  SET_TODO_LIST,
  REMOVE_TODO,
  SET_TODO_STATUS,
  SET_DOING_STATUS
} from './actionTypes';

export default {
  // 操作state里的list数据:

  /**
   * 将一个对象放入list数组的最上面
   * @param state state对象
   * @param todo 一个组装好的对象
   */
  [SET_TODO](state: IState, todo: ITodo): void {
    //unshift 希望每条数据都在最上面
    // state.list.unshift(todo);
    //平铺合并
    state.list = [todo, ...state.list];

    /**
     * console.log(state.list);
     * Proxy{
     *   [[Target]]: [
     *     {
     *       content: "123",
     *       id: 1638888249351,
     *       status: "willdo"
     *     }
     *   ]
     * }
     */
  },
  /**
   *将localStorage拿到的数组修改为list数组
   * @param state state对象
   * @param todoList 一个从localStorage拿到的数组
   */
  [SET_TODO_LIST](state: IState, todoList: ITodo[]): void {
    state.list = todoList;
  },
  /**
   * 将视图子组件id对应state.list相同的数据删除
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [REMOVE_TODO](state: IState, id: number): void {
    //不符合条件的项放入state.list数组里,符合条件的被过滤掉
    state.list = state.list.filter((item: ITodo) => item.id !== id);
  },
  /**
   * 点击复选框，点击state.list.status就为finished/否则willdo
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [SET_TODO_STATUS](state: IState, id: number): void {
    state.list = state.list.map((item: ITodo) => {
      //找到符合条件的项
      if (item.id === id) {
        switch (item.status) {
          case TODO_STATUS.FINISHED:
            item.status = TODO_STATUS.WILLDO;
            break;
          case TODO_STATUS.WILLDO:
          case TODO_STATUS.DOING:
            item.status = TODO_STATUS.FINISHED;
            break;
          default:
            break;
        }
      }

      //返回修改后的每一项
      return item;
    });
  },
  /**
   * 点击马上做按钮切换状态
   * @param ctx 可以解构comit和state
   * @param id 一个从视图子组件todo-item传递过来的id
   */
  [SET_DOING_STATUS](state: IState, id: number): void {
    state.list = state.list.map((item: ITodo) => {
      if (item.id !== id) {
        if (item.status === TODO_STATUS.DOING) {
          item.status = TODO_STATUS.WILLDO;
        }
      } else {
        item.status =
          item.status === TODO_STATUS.WILLDO
            ? TODO_STATUS.DOING
            : TODO_STATUS.WILLDO;
      }

      return item;
    });
  }
};
